package com.hb.concert;

import org.aspectj.lang.annotation.*;

@Aspect
public class NewAudience {
    // 1、用 @Pointcut 注解在一个 Aspectj 切面中定义可重用的切点
    // 2、performance() 方法的实际内容并不重要，在这里它实际上应该是空的。其实该方法本身只是一个标识，供 @Pointcut 注解依附
    // 3、其实下面用 @Pointcut 注解创建的切点在 Spring AOP 中就是被通知的方法，也就是要应用切面的方法。
    @Pointcut("execution(* com.hb.concert.Performance.perform(..))")
    public void performance() {}

    // 使用定义好的重用切点
    @Before("performance()")
    public void silenceCellPhones() {
        System.out.println("Silencing cell phones");
    }

    @Before("performance()")
    public void takeSeats() {
        System.out.println("Taking seats");
    }

    @AfterReturning("performance()")
    public void applause() {
        System.out.println("CLAP CLAP CLAP!!!");
    }

    @AfterThrowing("performance()")
    public void demandRefund() {
        System.out.println("Demanding a refund");
    }

    @After("performance()")
    public void Departure() {
        System.out.println("Audience leave here");
    }
}
